package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>Env�o de Mensaje</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo
 * PiCO</I>. <P> Recibe en <I>GraPiCO Textual</I>: <P> <Blockquote><Pre> Identificador � Mensaje
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> de cada constructor: <Blockquote><Pre> Identificador � Mensaje
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class SendMessage {

    // Variable para almacenar un env�o de mensaje representado en c�lculo PiCO.
    String sendMessagePico = "";
    // Variable para almacenar un identificador representado en GraPiCO Textual
    String identifierGraPicoT = "";
    // Variable para almacenar un mensaje representado en GraPiCO Textual
    String messageGraPicoT = "";
    // Objeto de la clase Message
    Message message;
    // Objeto de la clase Identifier
    Identifier identifier;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>SendMessage</Code>.<P> Toma un
     * <Code>Env�o de Mensaje</Code> representado en <I>GraPiCO Textual</I> y lo
     * separa en las dos partes que lo componen usando el s�mbolo de
     * sincronizaci�n "�", es decir que obtiene la parte de la expresi�n que
     * hace referencia a un
     * <Code>Identificador</Code> y la parte de la expresi�n que hace referencia
     * al
     * <Code>Mensaje</Code>.
     *
     * @param sendMessageGraPicoT Expresi�n equivalente a la representaci�n de
     * un
     * <Code>Env�o de Mensaje</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public SendMessage(String sendMessageGraPicoT, String nameProcess) {

        // Se obtiene el nombre o lista de nombres de procesos.
        nameCurrentProcess = nameProcess;

        // Se obtiene el identificacdor
        identifierGraPicoT = sendMessageGraPicoT.substring(0, sendMessageGraPicoT.indexOf("�"));
        // Se obtiene el mensaje
        messageGraPicoT = sendMessageGraPicoT.substring(identifierGraPicoT.length() + 1, sendMessageGraPicoT.length());
    }

    /**
     * M�todo generador de la traducci�n de un
     * <Code>Env�o de Mensaje</Code>.<P> Se obtiene la traducci�n del
     * <Code>Identificador</Code> y del
     * <Code>Mensaje</Code> y se separan usando el s�mbolo de sincronizaci�n
     * "�". <P> Se registra el nombre del
     * <Code>Identificador</Code> como requerido en la tabla de identificadores
     * para el <I>An�lisis Sem�ntico</I>.
     *
     * @return
     * <Code>Env�o de Mensaje</Code> representado en <I>C�lculo PiCO</I>.
     */
    public String traslate() {

        message = new Message(messageGraPicoT, nameCurrentProcess);
        identifier = new Identifier(identifierGraPicoT, "", "");

        String identifierPico = identifier.traslate();

        // Se verifica que corresponda a un identificador no num�rico
        if (Character.isLetter(identifierPico.charAt(0))) {

            SemanticAnalizer.PutRequiredIdentifiers(nameCurrentProcess, identifierPico);
        }
        sendMessagePico += identifierPico + " � " + message.traslate();
        return sendMessagePico;
    }
}